package com.example.demo.service;

import com.example.demo.enumeration.Campus;
import com.example.demo.enumeration.ItemCategory;
import com.example.demo.enumeration.ItemStatus;
import com.example.demo.enumeration.SortOrder;
import com.example.demo.pojo.dto.AddCommentDTO;
import com.example.demo.pojo.dto.AddItemDTO;
import com.example.demo.pojo.dto.UpdateItemDTO;
import com.example.demo.pojo.vo.*;

import java.math.BigDecimal;
import java.util.List;

public interface ItemService {
    /**
     * 新增商品
     * @param addItemDTO 带有新增商品数据的DTO
     * @return 操作是否成功
     */
    boolean addItem(AddItemDTO addItemDTO);

    /**
     * 获取商品详细信息
     * @param id 目标商品的id
     * @return 带有商品详细信息的VO
     */
    ItemDetailVO getDetail(Long id);

    /**
     * 根据商品id查询所属用户id
     * @param itemId 商品id
     * @return 所属用户id
     */
    Long selectUserIdByItemId(Long itemId);

    /**
     * 根据商品id查询商品状态
     * @param itemId 商品id
     * @return 商品状态
     */
    ItemStatus selectStatusByItemId(Long itemId);

    /**
     * 更新商品
     * @param updateItemDTO 带有更新商品数据的DTO
     * @return 操作是否成功
     */
    boolean updateItem(UpdateItemDTO updateItemDTO);

    /**
     * 更新商品价格
     * @param id 需要更新的商品id
     * @param price 商品新价格
     * @return 操作是否成功
     */
    boolean updatePrice(Long id, BigDecimal price);

    /**
     * 更新商品图片地址
     * @param id 需要更新的商品id
     * @param urls 商品地址列表
     * @return 操作是否成功
     */
    boolean updateImages(Long id, List<String> urls);

    /**
     * 删除指定商品
     * @param itemId 商品id
     * @return 操作是否成功
     */
    boolean deleteItem(Long itemId);

    /**
     * 条件分页搜索商品
     * @param page 当前页码
     * @param keyword 搜索关键词
     * @param category 商品类别
     * @param campus 商品所属校区
     * @param minPrice 最小价格
     * @param maxPrice 最大价格
     * @param sortByPrice 按价格排序方式
     * @return 带有分页查询数据的VO
     */
    PageVO searchItem(int page, String keyword, ItemCategory category, Campus campus, BigDecimal minPrice, BigDecimal maxPrice, SortOrder sortByPrice);

    /**
     * 获取当前用户商品列表
     * @return 当前用户商品列表
     */
    List<ItemListVO> getCurrentItemList();

    /**
     * 获取指定用户商品列表
     * @param userId 目标用户id
     * @return 目标用户商品列表
     */
    List<ItemListVO> getItemListByUserId(Long userId);

    /**
     * 根据商品id列表查询商品列表
     * @param idList 商品id列表
     * @return 商品列表
     */
    List<ItemListVO> getItemListByIdList(List<Long> idList);

    /**
     * 发布评论
     * @param addCommentDTO 带有评论数据的DTO
     * @return 操作是否成功
     */
    boolean addComment(AddCommentDTO addCommentDTO);

    /**
     * 删除评论
     * @param commentId 目标评论id
     * @return 操作是否成功
     */
    boolean deleteComment(Long commentId);

    /**
     * 根据评论id查询所属用户id
     * @param commentId 评论id
     * @return 所属用户id
     */
    Long selectUserIdByCommentId(Long commentId);

    /**
     * 根据评论id查询所属商品id
     * @param commentId 评论id
     * @return 所属商品id
     */
    Long selectItemIdByCommentId(Long commentId);

    /**
     * 根据评论id查询所属父评论id
     * @param commentId 评论id
     * @return 所属父评论id
     */
    Long selectParentIdByCommentId(Long commentId);

    /**
     * 获取商品评论
     * @param itemId 商品id
     * @return 商品评论列表
     */
    List<CommentVO> getItemCommentList(Long itemId);

    /**
     * 获取当前用户评论
     * @return 当前用户评论列表
     */
    List<UserCommentVO> getCurrentCommentList();

    /**
     * 举报商品
     * @param itemId 被举报的商品id
     * @param reason 举报原因
     * @param image 举报图片的url
     * @return 操作是否成功
     */
    boolean reportItem(Long itemId, String reason, String image);

    /**
     * 举报商品评论
     * @param commentId 被举报的评论id
     * @param reason 举报原因
     * @param image 举报图片的url
     * @return 操作是否成功
     */
    boolean reportItemComment(Long commentId, String reason, String image);
}